package jdk5;

import java.io.IOException;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 *	所谓类型擦除指的就是Java源码中的范型信息只允许停留在编译前期，
 *	而编译后的字节码文件中将不再保留任何的范型信息。也就是说，范型
 *	信息在编译时将会被全部删除，其中范型类型的类型参数则会被替换为
 *	Object类型，并在实际使用时强制转换为指定的目标数据类型。而
 *	C++中的模板则会在编译时将模板类型中的类型参数根据所传递的指
 *	定数据类型生成相对应的目标代码。
 */
public class Generic {
	public static void main(String[] args) {
		// 例如
		Map<Integer, Integer> squares = new HashMap<Integer, Integer>();
		squares.put(1, 100);

	}

	// 通配符类型：避免unchecked警告，问号表示任何类型都可以接受
	public void printList(List<?> list, PrintStream out) throws IOException {
		for (Iterator<?> i = list.iterator(); i.hasNext();) {
			out.println(i.next().toString());
		}
	}

	// 限制类型
	public static <T extends Number> double sum(T t) {
		return 0;
	}
}
